using System;
using Server.Items;

namespace Server.Items
{
    //daat99 OWLTR start - added base log class
    [FlipableAttribute(0x1bdd, 0x1be0)]
    public class BaseLog : Item, ICommodity, IAxe
    {
        private CraftResource m_Resource;

        [CommandProperty(AccessLevel.GameMaster)]
        public CraftResource Resource
        {
            get { return m_Resource; }
            set { m_Resource = value; InvalidateProperties(); }
        }

        int ICommodity.DescriptionNumber { get { return CraftResources.IsStandard(m_Resource) ? LabelNumber : 1075062 + ((int)m_Resource - (int)CraftResource.RegularWood); } }
        bool ICommodity.IsDeedable { get { return true; } }
        [Constructable]
        public BaseLog()
            : this(1)
        {
        }

        [Constructable]
        public BaseLog(int amount)
            : this(CraftResource.RegularWood, amount)
        {
        }

        [Constructable]
        public BaseLog(CraftResource resource)
            : this(resource, 1)
        {
        }
        [Constructable]
        public BaseLog(CraftResource resource, int amount)
            : base(0x1BDD)
        {
            Stackable = true;
            Weight = 2.0;
            Amount = amount;

            m_Resource = resource;
            Hue = CraftResources.GetHue(resource);
        }

        public override void GetProperties(ObjectPropertyList list)
        {
            base.GetProperties(list);

            if (!CraftResources.IsStandard(m_Resource))
            {
                int num = CraftResources.GetLocalizationNumber(m_Resource);

                if (num > 0)
                    list.Add(num);
                else
                    list.Add(CraftResources.GetName(m_Resource));
            }
        }
        public BaseLog(Serial serial)
            : base(serial)
        {
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)2); // version

            writer.Write((int)m_Resource);
        }

        public static bool UpdatingBaseLogClass;
        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();

            if (version == 1)
                UpdatingBaseLogClass = true;
            m_Resource = (CraftResource)reader.ReadInt();

            if (version == 0)
                m_Resource = CraftResource.RegularWood;
        }

        public virtual bool TryCreateBoards(Mobile from, double skill, Item item)
        {
            if (Deleted || !from.CanSee(this))
                return false;
            else if (from.Skills.Carpentry.Value < skill &&
                from.Skills.Lumberjacking.Value < skill)
            {
                item.Delete();
                from.SendLocalizedMessage(1072652); // You cannot work this strange and unusual wood.
                return false;
            }
            base.ScissorHelper(from, item, 1, false);
            return true;
        }

        public virtual bool Axe(Mobile from, BaseAxe axe)
        {
            if (!TryCreateBoards(from, 0, new Board()))
                return false;

            return true;
        }
    }

    public class Log : BaseLog
    {
        [Constructable]
        public Log()
            : this(1)
        {
        }

        [Constructable]
        public Log(int amount)
            : base(CraftResource.RegularWood, amount)
        {
        }

        public Log(Serial serial)
            : base(serial)
        {
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);
            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);
            //don't deserialize anything on update
            if (BaseLog.UpdatingBaseLogClass)
                return;

            int version = reader.ReadInt();
        }

        public override bool Axe(Mobile from, BaseAxe axe)
        {
            if (!TryCreateBoards(from, 95, new Board()))
                return false;

            return true;
        }
    }
    //daat99 OWLTR end - adding base log class
	public class HeartwoodLog : BaseLog
	{
		[Constructable]
		public HeartwoodLog() : this( 1 )
		{
		}
		[Constructable]
		public HeartwoodLog( int amount ) 
			: base( CraftResource.Heartwood, amount )
		{
		}
		public HeartwoodLog( Serial serial ) : base( serial )
		{
		}
		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int)0 ); // version
		}
		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override bool Axe( Mobile from, BaseAxe axe )
		{
			if ( !TryCreateBoards( from , 100, new HeartwoodBoard() ) )
				return false;

			return true;
		}
	}

    public class BloodwoodLog : BaseLog
	{
		[Constructable]
		public BloodwoodLog()
			: this( 1 )
		{
		}
		[Constructable]
		public BloodwoodLog( int amount )
			: base( CraftResource.Bloodwood, amount )
		{
		}
		public BloodwoodLog( Serial serial )
			: base( serial )
		{
		}
		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int)0 ); // version
		}
		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override bool Axe( Mobile from, BaseAxe axe )
		{
			if ( !TryCreateBoards( from , 100, new BloodwoodBoard() ) )
				return false;

			return true;
		}
	}

    public class FrostwoodLog : BaseLog
	{
		[Constructable]
		public FrostwoodLog()
			: this( 1 )
		{
		}

		[Constructable]
		public FrostwoodLog( int amount )
			: base( CraftResource.Frostwood, amount )
		{
		}

		public FrostwoodLog( Serial serial )
			: base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int)0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override bool Axe( Mobile from, BaseAxe axe )
		{
			if ( !TryCreateBoards( from , 100, new FrostwoodBoard() ) )
				return false;

			return true;
		}
	}

    public class OakLog : BaseLog
	{
		[Constructable]
		public OakLog()
			: this( 1 )
		{
		}

		[Constructable]
		public OakLog( int amount )
			: base( CraftResource.OakWood, amount )
		{
		}

		public OakLog( Serial serial )
			: base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int)0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override bool Axe( Mobile from, BaseAxe axe )
		{
			if ( !TryCreateBoards( from , 65, new OakBoard() ) )
				return false;

			return true;
		}
	}

    public class AshLog : BaseLog
	{
		[Constructable]
		public AshLog()
			: this( 1 )
		{
		}

		[Constructable]
		public AshLog( int amount )
			: base( CraftResource.AshWood, amount )
		{
		}

		public AshLog( Serial serial )
			: base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int)0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override bool Axe( Mobile from, BaseAxe axe )
		{
			if ( !TryCreateBoards( from , 80, new AshBoard() ) )
				return false;

			return true;
		}
	}

    public class YewLog : BaseLog
	{
		[Constructable]
		public YewLog()
			: this( 1 )
		{
		}

		[Constructable]
		public YewLog( int amount )
			: base( CraftResource.YewWood, amount )
		{
		}

		public YewLog( Serial serial )
			: base( serial )
		{
		}

		public override void Serialize( GenericWriter writer )
		{
			base.Serialize( writer );

			writer.Write( (int)0 ); // version
		}

		public override void Deserialize( GenericReader reader )
		{
			base.Deserialize( reader );

			int version = reader.ReadInt();
		}

		public override bool Axe( Mobile from, BaseAxe axe )
		{
			if ( !TryCreateBoards( from , 95, new YewBoard() ) )
				return false;

			return true;
		}
	}
    //daat99 OWLTR start - custom woods
    public class EbonyLog : BaseLog
    {
        [Constructable]
        public EbonyLog()
            : this(1)
        {
        }

        [Constructable]
        public EbonyLog(int amount)
            : base(CraftResource.Ebony, amount)
        {
        }

        public EbonyLog(Serial serial)
            : base(serial)
        {
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }

        public override bool Axe(Mobile from, BaseAxe axe)
        {
            if (!TryCreateBoards(from, 95, new EbonyBoard()))
                return false;

            return true;
        }
    }

    public class BambooLog : BaseLog
    {
        [Constructable]
        public BambooLog()
            : this(1)
        {
        }

        [Constructable]
        public BambooLog(int amount)
            : base(CraftResource.Bamboo, amount)
        {
        }

        public BambooLog(Serial serial)
            : base(serial)
        {
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }

        public override bool Axe(Mobile from, BaseAxe axe)
        {
            if (!TryCreateBoards(from, 95, new BambooBoard()))
                return false;

            return true;
        }
    }

    public class PurpleHeartLog : BaseLog
    {
        [Constructable]
        public PurpleHeartLog()
            : this(1)
        {
        }

        [Constructable]
        public PurpleHeartLog(int amount)
            : base(CraftResource.PurpleHeart, amount)
        {
        }

        public PurpleHeartLog(Serial serial)
            : base(serial)
        {
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }

        public override bool Axe(Mobile from, BaseAxe axe)
        {
            if (!TryCreateBoards(from, 95, new PurpleHeartBoard()))
                return false;

            return true;
        }
    }

    public class RedwoodLog : BaseLog
    {
        [Constructable]
        public RedwoodLog()
            : this(1)
        {
        }

        [Constructable]
        public RedwoodLog(int amount)
            : base(CraftResource.Redwood, amount)
        {
        }

        public RedwoodLog(Serial serial)
            : base(serial)
        {
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }

        public override bool Axe(Mobile from, BaseAxe axe)
        {
            if (!TryCreateBoards(from, 95, new RedwoodBoard()))
                return false;

            return true;
        }
    }

    public class PetrifiedLog : BaseLog
    {
        [Constructable]
        public PetrifiedLog()
            : this(1)
        {
        }

        [Constructable]
        public PetrifiedLog(int amount)
            : base(CraftResource.Petrified, amount)
        {
        }

        public PetrifiedLog(Serial serial)
            : base(serial)
        {
        }

        public override void Serialize(GenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write((int)0); // version
        }

        public override void Deserialize(GenericReader reader)
        {
            base.Deserialize(reader);

            int version = reader.ReadInt();
        }

        public override bool Axe(Mobile from, BaseAxe axe)
        {
            if (!TryCreateBoards(from, 95, new PetrifiedBoard()))
                return false;

            return true;
        }
    }
    //daat99 OWLTR end - custom woods
}